package com.panda.utils;

import org.springframework.beans.BeanUtils;

import java.util.List;
import java.util.stream.Collectors;

public class BeanCopyUtil {

    private BeanCopyUtil() {

    }

    /**
     * vo对象的拷贝工具方法
     * @param source bean拷贝对象
     * @param clazz 字节码类型，其实是vo的类型
     * @param <T> 泛型，根据传进来的字节码类型确定是哪种类型
     * @return 返回拷贝vo对象
     * 这个Class<T>   T表示可以传入任何类型的对象
     * * 参数T
     *  第一个 表示是在这方法定义的一个泛型
     *  第二个 表示返回的是T类型的数据
     *  第三个 限制参数类型为T
     */
    public static <T> T copyBean(Object source, Class<T> clazz) {

        T result = null;

        try {
//            通过类的反射创建对象实例
//            newInstance()方法实际上就是使用对应类的无参构造方法来创建该类的实例
//            java 1.9newInstance()已经被弃用 ,取而代之用这个
            result = clazz.getDeclaredConstructor().newInstance();

            BeanUtils.copyProperties(source, result);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }

    public static <O,T> List<T> copyBeans(List<O> list, Class<T> clazz) {

        return list.stream().map(o -> copyBean(o, clazz)).collect(Collectors.toList());
    }


}
